package com.wenlong.crud.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wenlong.crud.pojo.Employee;
import com.wenlong.crud.pojo.Msg;
import com.wenlong.crud.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 苏文龙
 * @version 1.0
 * 处理雇员相关信息Controller
 */
@Controller
public class EmployeeContronller {

    @Autowired
    EmployeeService employeeService;

    /**
     * 根据 id 删除用户
     *
     * @param ids
     * @return
     */
    @RequestMapping(value = "/emp/{ids}", method = RequestMethod.DELETE)
    @ResponseBody
    public Msg deleteEmp(@PathVariable("ids") String ids) {
        if (ids.contains("-")) {
            // 包含 - 说明是多个id，是批量删除
            List<Integer> list = new ArrayList<>();
            String[] arr_ids = ids.split("-");
            for (String arr_id : arr_ids) {
                list.add(Integer.parseInt(arr_id));
            }
            employeeService.deleteBatch(list);
        } else {
            // 不包含 - 说明是多个id，是批量删除
            Integer id = Integer.parseInt(ids);
            employeeService.deleteEmp(id);
        }
        return Msg.Success();
    }

    /**
     * 安装主键有选择的更新数据
     *
     * @param employee
     * @return
     */
    @RequestMapping(value = "/emp/{empId}", method = RequestMethod.PUT)
    @ResponseBody
    public Msg updateEmp(Employee employee) {
        employeeService.updateEmp(employee);
        return Msg.Success();
    }

    /**
     * 根据id查询雇员信息
     *
     * @param id
     * @return
     */
    @RequestMapping(value = "/emp/{id}", method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmp(@PathVariable("id") Integer id) {
        Employee employee = employeeService.getEmp(id);
        return Msg.Success().add("emp", employee);
    }

    /**
     * 检查用户名是否可以用
     *
     * @param empName
     * @return 根据状态码判断是否可用 == 100 可用; == 200 不可用
     */
    @RequestMapping("/checkEmpName")
    @ResponseBody
    public Msg checkEmpName(@RequestParam("empName") String empName) {
        String regx = "(^[a-zA-Z0-9_-]{3,16}$)|(^[\\u2E80-\\u9FFF]{2,5}$)";
        if (!empName.matches(regx)) {
            return Msg.False().add("va_msg", "用户bixu是2-5位中文或者6-16位英文和数字的组合");
        }
        // 数据库用户名重发校验
        boolean flag = employeeService.checkEmpName(empName);
        if (flag) {
            return Msg.Success();
        } else {
            return Msg.False().add("va_msg", "用户名不可用");
        }
    }

    /**
     * 保存员工数据
     * 支持 JSR303 校验
     * 导入 Hibernate-Validator
     *
     * @return
     */
    @RequestMapping(value = "/emp", method = RequestMethod.POST)
    @ResponseBody
    // Valid 应该是javax包下的,不应该是jakarta包下的,但是javax我却找不到Valid
    public Msg savaEmps(@Valid Employee employee, BindingResult result) {
        if (result.hasErrors()) {
            // '校验失败，应该返回失败，在模态框中显示校验失败的错误信息
            Map<String, Object> map = new HashMap<>();
            List<FieldError> fieldErrors = result.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                System.out.println("错误字段: " + fieldError.getField());
                System.out.println("错误信息: " + fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.False().add("errorFields", map);
        } else {
            employeeService.saveEmp(employee);
            return Msg.Success();
        }
    }


    @RequestMapping("/emps")
    @ResponseBody
    public Msg getEmpsWithJson(@RequestParam(value = "pn", defaultValue = "1") Integer pn) {
        // 查询之前调用 PageHelper.startPage(pn, 5);实现分页
        PageHelper.startPage(pn, 5);
        // 紧跟的查询employeeService.getAllemps();就是分页查询
        List<Employee> emps = employeeService.getAllEmps();
        // 使用 PageInfo 包装查询后的结果，因为其包含查询后的数据与分页信息
//        PageInfo pageInfo = new PageInfo(emps);
        // navigatePages 5 表示导航条连续显示5页
        PageInfo pageInfo = new PageInfo(emps, 5);
        return Msg.Success().add("pageInfo", pageInfo);
    }

    //    @RequestMapping("/emps")
    public String getAllEmps(@RequestParam(value = "pn", defaultValue = "1") Integer pn, Model model) {
        // 查询之前调用 PageHelper.startPage(pn, 5);实现分页
        PageHelper.startPage(pn, 5);
        // 紧跟的查询employeeService.getAllemps();就是分页查询
        List<Employee> emps = employeeService.getAllEmps();
        // 使用 PageInfo 包装查询后的结果，因为其包含查询后的数据与分页信息
//        PageInfo pageInfo = new PageInfo(emps);
        // navigatePages 5 表示导航条连续显示5页
        PageInfo pageInfo = new PageInfo(emps, 5);
        model.addAttribute("pageInfo", pageInfo);
        return "list";
    }
}
